Důležitým prvkem objektově orientovaných projektů jsou třídy - skupiny objektů s některými společnými vlastnostmi (podobně třeba jako školní třída je skupina žáků, kteří mají například stejný rozvrh).
V Imagine slouží pro vytvoření nové třídy příkaz newclass, použijeme-li například příkaz:
newclass "turtle "ctverec [ ]
znamená to, že bude vytvořena nová třída s názvem ctverec , která bude potomkem (podtřídou) třídy turtle (želvy), bude tedy například znát želví příkazy. V hranatých závorkách by mohly být uvedeny vlastnosti nové třídy (procedury, události, proměnné), na to by ale většinou byl jen příkazový řádek nešikovný, proto je vhodnější měnit vlastnosti jako u ostatních objektů v okně Paměť. Novou třídu "želvího typu" v okně Paměť poznáte podle světlejší ikonky želvičky vedle názvu třídy.
Třída turtle má také speciální proměnnou shape pro svůj tvar. Pokud nové třídě ctverec, uvedené v příkladu, v záložce Proměnné přidáte proměnnou shape, můžete z příkazového řádku do této proměnné načíst nový tvar této třídy:
ctverec'setshape loadImage "ctverec.lgf
Jistější je za příkazem loadImage spustit klávesou F9 pomocníka pro vyhledání příslušného obrázku.
Pro vytvoření nového objektu dané třídy je určen příkaz new, například:
new "ctverec [ ]
Projekt KAPKA v minulé lekci měl jednu vadu - shůry padala vždy jen jedna kapka a další se objevila teprve, až když předešlá dopadla. Právě využití tříd nám umožní, aby padalo více kapek najednou.
Projekt z minulé lekce byl upraven v následujících krocích:
- vytvoření nové třídy s názvem kapka, k tomu byl využitý uvedený příkaz newclass:
newclass "turtle "kapka [ ]
- v záložce Proměnné této nové třídy byla přidaná proměnná shape
- z příkazového řádku byl použit příkaz pro načtení tvaru (s využitím klávesy F9):
kapka'setshape loadImage "kapka.lgf
- aby kapka začala padat, jakmile se objeví, byla přidána Událost onCreate (při vytvoření) a do ní zapsán název procedury pohyb, kterou želvička začne po vytvoření vykonávat
to pohyb
pu
let"x -200+random(400)
let"y 200
setxcor :x setycor :y
every 10 [bk 1 let"y :y-1 wait 10
if :y=-150
[ifelse overlapped=[t1]
[text5'setvalue text5+1 ht]
[text2'setvalue text2-1 ht if text2=0 [text6'setvalue " printtotextbox "text6 print [GAME OVER] stopall]]
]]
end
V této proceduře byly oproti předešlé lekci provedeny dvě zásadní změny:
- příkaz let vytváří takzvanou lokální proměnnou, existující jen pro dotyčný objekt (aby mohly mít různé kapky různé souřadnice)
- místo cyklu while byl použit příkaz every, ten totiž běží neustále na pozadí (a může jich běžet více), zatímco u while by se čekalo než cyklus skončí (další kapka by mohla padat až první dopadne)
Další změna už není tak zásadní, všimněte si, že zmizel příkaz make, namísto proměnných byly využity hodnoty textových polí - text2 zústalo pro počet životů a přibylo pole text5 pro počet chycených kapek (na rozdíl od proměnných nejsou před jejich názvy dvojtečky!).
Změny v proceduře pohyb si vynutily i změny ve startovací proceduře celého projektu:
to start
eraseobject allOf "kapka
t1'pohyb
text2'setvalue 3
text5'setvalue 0
text6'setvalue "HRAJEME
while [text2>0]
[new "kapka [ ] wait 1500]
end
Příkaz eraseobject allOf "kapka smaže všechny nové objekty typu (druhu) kapka, samotnou třídu ale ne - vymaže tedy všechny kapky, které na stránce vznikly v minulé hře.
Dále zmizely proměnné a zůstaly jen hodnoty textových polí (přibylo pole text6 pro GAME OVER), za druhé jsou vytvářeny nové kapky dokud je počet životů větší než nula. Tyto nové kapky mají automaticky přidělovány nové názvy t2, t3 atd.
Ze složky s lekcemi si zkopíruj do své složky projekt kapky.imp (odsud pomocí pravého tlačítka a Uložit cíl jako..). Doplň do něj:
- novou třídu kámen a načti jí tvar (například kámen ve složce obrázků)
- doplň událost onCreate a proceduru podobnou proceduře pro kapky, jen s tím rozdílem, že při "chycení" kamene se hra ukončí
- uprav startovací proceduru start tak, aby se objevila vždy jedna normální kapka a po ní jeden "kámen"
- než projekt uložíte, smažte všechny želvy (mimo t1), které vznikly při všech pokusech
K základní úloze přidej další druh "kapek", které hráči při "chycení" přidají život (tvar by mohl být třeba červený křížek vytvořený v LogoMotion :-) ). Oproti normálním kapkám mají ale padat rychleji.
K základní úloze a úloze na plus doplň závislost pauzy mezi objevením kapek na počtu chycených kapek (čím více chycených kapek, tím rychleji se budou objevovat nové).